package com.vista.utils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.comun.utils.Constantes;
import com.modelo.entity.Documento;
import com.modelo.entity.Obra;
import com.modelo.entity.ObraDocumento;

/**
 * Clase con las utilidades comunes en el paquete WEB
 * 
 * @author David
 * 
 */
public class UtilsWeb {

	/**
	 * No devuelve el valor boolean del Integer
	 * 
	 * @param valor
	 * @return boolean
	 */
	public static boolean getBoolean(Integer valor) {
		if (valor.equals(Constantes.TRUE)) {
			return true;
		}
		return false;
	}

	/**
	 * Devuelve los documentos asociados a la obra.
	 * 
	 * @param obra
	 * @return
	 */
	public static List<Documento> getDocumentos(Obra obra) {
		List<Documento> listaDoc = new ArrayList<Documento>();

		for (Iterator<ObraDocumento> it = obra.getObraDocumentos().iterator(); it.hasNext();) {
			ObraDocumento obraDoc = it.next();
			listaDoc.add(obraDoc.getDocumento());
		}

		return listaDoc;

	}

	/**
	 * Nos devuelve el valor Integer del boolean
	 * 
	 * @param valor
	 * @return Integer
	 */
	public static Integer getInteger(Boolean valor) {
		if (valor) {
			return Constantes.TRUE;
		}
		return Constantes.FALSE;
	}

	/**
	 * Metodo que devuelve el objeto devuelto por el metodo del objeto que le
	 * pasamos.
	 * 
	 * @param obj
	 * @param metodo
	 * @return Object
	 */
	public static Object invocaGets(Object obj, String metodo) {
		Object retorno = null;
		Method metodoGet;

		try {
			metodoGet = obj.getClass().getMethod(metodo, null);
			retorno = metodoGet.invoke(obj, null);
		} catch (IllegalAccessException e) {

		} catch (SecurityException e) {

		} catch (NoSuchMethodException e) {

		} catch (IllegalArgumentException e) {

		} catch (InvocationTargetException e) {

		}

		return retorno;
	}

	/**
	 * Obtiene todos los ids de una lista de entidades.
	 * 
	 * @param lista
	 * @return List<Integer>
	 */
	public static <T> List<Integer> obtenerIdsLista(List<T> lista) {
		List<Integer> listaRetorno = new ArrayList<Integer>();

		for (T t : lista) {
			Object id = invocaGets(t, "getId");
			if (id instanceof Integer) {
				listaRetorno.add((Integer) id);
			} else {
				// logger.debug("UtilsWeb :: obtenerIdsLista :: Error: El objeto no es de tipo entero."+
				// id.toString());
			}
		}

		return listaRetorno;
	}
}
